package com.ksyun.campus.metaserver.service;

import com.ksyun.campus.metaserver.common.result.BaseResult;
import com.ksyun.campus.metaserver.entity.dto.req.WriteReqDto;
import com.ksyun.campus.metaserver.entity.meta.StatInfo;

import java.util.List;

/**
 * 元数据服务业务层
 */
public interface MetaService {
    /**
     * 创建文件
     *
     * @param fileSystemName 命名空间
     * @param path           文件路径
     * @return               文件元数据
     */
    BaseResult<StatInfo> createFile(String fileSystemName, String path);

    /**
     * 文件写完了 更新元数据
     *
     * @param writeReqDto 写文件请求实体
     */
    BaseResult<String> commitWrite(String fileSystemName, WriteReqDto writeReqDto);

    /**
     * 根据path返回文件元数据
     *
     * @param fileSystemName 命名空间
     * @param path           文件路径
     * @return               文件元数据
     */
    BaseResult<StatInfo> open(String fileSystemName, String path);

    /**
     * 根据path创建空文件夹
     *
     * @param fileSystemName 命名空间
     * @param path           文件路径
     * @return               文件元数据
     */
    BaseResult<StatInfo> mkdir(String fileSystemName, String path);

    /**
     * 收集当前path下的所有文件夹信息
     *
     * @param fileSystemName 命名空间
     * @param path           文件夹路径
     * @return               文件夹列表
     */
    BaseResult<List<String>> listdir(String fileSystemName, String path);

    /**
     * 删除文件
     *
     * @param fileSystemName 命名空间
     * @param path           文件夹路径
     */
    BaseResult<StatInfo> delete(String fileSystemName, String path);

    /**
     * 根据path获取文件元数据
     *
     * @param fileSystemName 命名空间
     * @param path           文件路径
     * @return               文件元数据
     */
    BaseResult<StatInfo> getStats(String fileSystemName, String path);

    /**
     * 获取当前路径下的所有文件元数据信息
     *
     * @param fileSystemName 命名空间
     * @param path           目录路径
     * @return               文件元数据信息集合
     */
    BaseResult<List<StatInfo>> listFileStats(String fileSystemName, String path);

    /**
     * 删除失败回调恢复
     */
    BaseResult<String> deleteErrorRecovery(String fileSystemName, StatInfo statInfo);
}
